package com.cvcetic.ciudadverde;

//import com.cvcetic.ciudadverde.bbdd.Aplicacion;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import com.cvcetic.ciudadverde.beans.Punto;
import com.cvcetic.ciudadverde.beans.PuntoBici;
import com.cvcetic.ciudadverde.utils.LocalizacionUtil;
import com.cvcetic.ciudadverde.utils.PuntoItemizedOverlay;
import com.cvcetic.ciudadverde.utils.PuntoOverlayItem;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;

public class MainActivity extends MapActivity {

	public static final String ADDRESS_RESULT = "address";

	private Button mapLocationButton;
	private Button useLocationButton;
	private EditText addressText;
	private MapView mapView;
	private Address address;
	private ImageButton btnBici;
	private ImageButton btnBus;
	private Aplicacion app;
	private LocationManager locationManager;
	private MapController mapController;
	private ProgressDialog progressDialog;
	private ArrayList<PuntoOverlayItem> ptos;
	private PuntoItemizedOverlay puntoOverlay;
	private Drawable marcadorPunto;
	private final Handler handler = new Handler() {

		public void handleMessage(final Message msg) {
			progressDialog.dismiss();
			Log.d("DebugMain",
					"  Entramos en el Handler la cantidad de puntos Overlay son "
							+ ptos.size());
			puntoOverlay = new PuntoItemizedOverlay(ptos, marcadorPunto,
					MainActivity.this);
			mapView.getOverlays().add(puntoOverlay);
			mapView.invalidate();
		}
	};

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		setUpViews();
		app = (Aplicacion) getApplication();
	}

	@Override
	public void onStart() {
		super.onStart();
		marcadorPunto = getResources().getDrawable(R.drawable.cc);
		int markerWidth = marcadorPunto.getIntrinsicWidth();
		int markerHeight = marcadorPunto.getIntrinsicHeight();
		marcadorPunto.setBounds(0, markerHeight, markerWidth, 0);
		this.locationManager = (LocationManager) this
				.getSystemService(Context.LOCATION_SERVICE);
		this.locationManager.getProvider(LocationManager.GPS_PROVIDER);
		GeoPoint ultimoPuntoConocido = cogerUltimoPuntoConocido();
		this.mapController = this.mapView.getController();
		this.mapController.setZoom(14);
		this.mapController.animateTo(ultimoPuntoConocido);
		getDatosPuntos(ultimoPuntoConocido);

	}

	private GeoPoint cogerUltimoPuntoConocido() {
		GeoPoint punto = null;
		Location localizacion = this.locationManager
				.getLastKnownLocation(LocationManager.GPS_PROVIDER);
		if (localizacion != null) {
			punto = LocalizacionUtil.getGeoPoint(localizacion);
			Log.d("DebugMain", "Cogemos la posicion del GPS");
		} else {
			Log.d("DebugMain",
					"Cogemos vitoria como posicion inicial por defecto");
			punto = LocalizacionUtil.VITORIA;
		}
		return punto;
	}

	private void setUpViews() {

		addressText = (EditText) findViewById(R.id.address);
		mapLocationButton = (Button) findViewById(R.id.map_location_button);
		
		mapView = (MapView) findViewById(R.id.map);
		mapView.setBuiltInZoomControls(true);

		

		// ubicar manualmente
		mapLocationButton.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				mapCurrentAddress();
			}
		});

		btnBici = (ImageButton) findViewById(R.id.imageButton1);
		btnBici.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent i = new Intent(MainActivity.this,
						PuntosBiciActivity.class);
				startActivity(i);
			}
		});
		btnBus = (ImageButton) findViewById(R.id.imageButton2);
		btnBus.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				addressText.setText("BUSSSSS");
			}
		});

	}

	// recoge la direccion que el usuario inserta en el edittext
	protected void mapCurrentAddress() {
		String addressString = addressText.getText().toString();
		Geocoder g = new Geocoder(this);
		List<Address> addresses = new ArrayList<Address>();
		try {
			addresses = g.getFromLocationName(addressString, 1);
			if (addresses != null && addresses.size() > 0) {

			} else {
				// show the user a note that we failed to get an address
			}
		} catch (IOException e) {
			Address a = new Address(new Locale("ES"));
			a.setLatitude(-2.6647);
			a.setLongitude(42.83941);
			addresses.add(a);
			e.printStackTrace();
		} finally {
			address = addresses.get(0);
			List<Overlay> mapOverlays = mapView.getOverlays();
			AddressOverlay addressOverlay = new AddressOverlay(address);
			mapOverlays.add(addressOverlay);
			mapView.invalidate();
			final MapController mapController = mapView.getController();
			mapController.animateTo(addressOverlay.getGeopoint(),
					new Runnable() {
						public void run() {
							mapController.setZoom(15);
						}
					});
			mapLocationButton.setEnabled(true);
		}
	}

	@Override
	protected boolean isRouteDisplayed() {
		// TODO Auto-generated method stub
		return false;
	}

	private void getDatosPuntos(final GeoPoint point) {
		Log.d("DebugMain",
				"  Entramos en el metodo getDatosPuntos para marcar en el mapa los puntos");
		this.progressDialog = ProgressDialog.show(this,
				"Procesando Datos . . .", "Añadiendo puntos en el Mapa", true,
				false);

		new Thread() {
			@Override
			public void run() {

				String lats = LocalizacionUtil.parsePoint(point.getLatitudeE6()
						/ LocalizacionUtil.MILLON, true);
				String lons = LocalizacionUtil
						.parsePoint(point.getLongitudeE6()
								/ LocalizacionUtil.MILLON, false);

				List<Punto> apb = app.loadPuntosBici();

				ptos = getPuntoOverlayItems(apb);
				handler.sendEmptyMessage(1);
			};
		}.start();
	}

	private ArrayList<PuntoOverlayItem> getPuntoOverlayItems(List<Punto> puntos) {
		ArrayList<PuntoOverlayItem> PuntoOverylayItemList = new ArrayList<PuntoOverlayItem>();
		for (Punto pt : puntos) {

			GeoPoint gp = LocalizacionUtil.getGeoPointconPunto(pt);
			if (gp != null) {
				PuntoOverlayItem poi = new PuntoOverlayItem(gp, pt);
				PuntoOverylayItemList.add(poi);
			} else {
				Log.w("DebugMain",
						" Datos imcompletos para este punto  "
								+ pt.getNombre_es());
			}

		}
		return PuntoOverylayItemList;
	}

}